#include <stdio.h>
#include <stdlib.h>

int main() {
    int m, n;

    // 输入行数和列数
    printf("请输入矩阵的行数和列数 (m n): ");
    scanf("%d %d", &m, &n);

    // 声明一维指针数组，存放每一行的首地址   sizeof(int *)是度量一个int类型的指针的内存占用的字节的数量
    int **matrix = (int **) malloc(m * sizeof(int *)); //只不过是申请了空间 并没与填充具体的地址元素
    if (matrix == NULL) {
        printf("内存分配失败！\n");
        return -1;
    }

    // 为每一行元素申请空间 填充具体的地址元素
    for (int i = 0; i < m; i++) {
        matrix[i] = (int *) malloc(n * sizeof(int)); //申请二维数组的子数组空间并进行初始化 把地址给到每一个行指针所指向的内存空间
        if (matrix[i] == NULL) {
            printf("内存分配失败！\n");
            // 释放已分配的内存
            for (int j = 0; j < i; j++) {
                free(matrix[j]);
            }
            free(matrix);
            return -1;
        }
    }

    // 读入m*n个元素
    printf("请输入矩阵的元素：\n");
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }

    // 输出矩阵
    printf("输入的矩阵为：\n");
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 释放每一个行指针所指空间
    for (int i = 0; i < m; i++) {
        free(matrix[i]);
    }
    free(matrix);

    return 0;
}
